home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / game / pr / src / prmain.c < prev    next >
Text File  |  1995-08-20  |  10KB  |  464 lines

  1. /*==========================================
  2.     "prmain.c" PR main program V2.0 L02
  3. ==========================================*/
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <math.h>
  8. #include <fmcfrb.h>
  9. #include <malloc.h>
  10. #include "timekh.h"
  11. #include "filekh.h"
  12. #include "prdef.h"
  13.  
  14. //#define    POLMAX    2000
  15.  
  16. int    *_cos,*_sin;    //_cos[1000],_sin[1000];
  17. short  polmax;
  18. poly   *mapdata;    //[POLMAX];
  19. poly   cardata[3*7];
  20. pol2d  *poldat;        //[POLMAX];
  21. short  rd;
  22. rdata  *road;        //[POLMAX];
  23. short  cpn, *cp;
  24. short  *exTime;
  25. poly   car[3];
  26. poly   ecar[3];
  27. int    _time[20]=0,_dn=0;
  28.  
  29. way *way1st,*waybst;
  30. //extern way *ecar[6];
  31. extern way cway;
  32.  
  33. int        maxtime=MAXTIME,h=25;
  34. short    blap[10],flap[10];
  35. int     lapFlag=0,wayFlag=0;
  36.  
  37. int        mapNo=0;
  38. char    mapfile[][13]={"course00.pmd","course01.pmd","course02.pmd"};
  39. char    wayfile[][13]={"course00.way","course01.way","course02.way"};
  40. char    lapfile[][13]={"course00.lap","course01.lap","course02.lap"};
  41.  
  42. char    mapName[][15]={    "  初級コース  ",
  43.                         "  中級コース  ",
  44.                         "  上級コース  " };
  45.  
  46. extern int initGrp();
  47. extern int demo();
  48. extern int game( short sx, short sy, short sang );
  49.  
  50. /*==============================
  51.     マップデータの読み込み
  52. ==============================*/
  53. int read_mapdata( int mn, short *x, short *y, short *ang )
  54. {
  55.     int i,j,ret=1;
  56.     FILE *fp;
  57.  
  58.     fp=fopen(mapfile[mn],"rb");
  59.     if (fp==NULL) {
  60.         puts("マップファイルのオープンに失敗しました。");
  61.         return -2;
  62.     }
  63.     getShort(*x,fp);
  64.     getShort(*y,fp);
  65.     getShort(*ang,fp);
  66.  
  67.     getShort(polmax,fp);
  68.     mapdata = (poly *)malloc( polmax*sizeof(poly) );
  69.     if( mapdata==NULL ){
  70.         ret = -1;
  71.         goto last;
  72.     }
  73.     for (i=0; i<polmax; ++i){
  74.         for(j=0; j<4; ++j){
  75.             getShort(mapdata[i].px[j],fp);
  76.             getShort(mapdata[i].py[j],fp);
  77.             getShort(mapdata[i].pz[j],fp);
  78.         }
  79.         getShort(mapdata[i].type,fp);
  80.         mapdata[i].n=4;
  81.     }
  82.  
  83.     getShort(rd,fp);
  84.     road = (rdata *)malloc( rd*sizeof(rdata) );
  85.     if( road==NULL ){
  86.         ret = -1;
  87.         goto last;
  88.     }
  89.     fread( road, sizeof(rdata), rd, fp );
  90.  
  91.     getShort(cpn,fp);
  92.     cp = (short *)malloc( cpn*sizeof(short) );
  93.     if( cp==NULL ){
  94.         ret = -1;
  95.         goto last;
  96.     }
  97.     fread( cp, sizeof(short), cpn, fp );
  98.  
  99.     exTime = (short *)malloc( cpn*sizeof(short) );    
  100.     if( exTime==NULL ){
  101.         ret = -1;
  102.         goto last;
  103.     }
  104.     fread( exTime, sizeof(short), cpn, fp );
  105.  
  106.     if (ferror(fp)){
  107.         puts("マップファイルのリードエラーです。");
  108.         ret = -2;
  109.     }
  110.  
  111.   last:
  112.     fclose(fp);
  113.     return ret;
  114. }
  115.  
  116. /*============================
  117.     carデータの設定
  118. ============================*/
  119. int setCarDat()
  120. {
  121.     car[2].px[0] =0;    car[2].py[0] =-5;    car[2].pz[0] =4;
  122.     car[2].px[1] =5;    car[2].py[1] =2;    car[2].pz[1] =4;
  123.     car[2].px[2] =0;    car[2].py[2] =4;    car[2].pz[2] =4;
  124.     car[2].px[3] =-5;    car[2].py[3] =2;    car[2].pz[3] =4;
  125.     car[2].type = C32K(31,0,15);
  126.     car[0].px[0] =0;    car[0].py[0] =-5;    car[0].pz[0] =4;
  127.     car[0].px[1] =5;    car[0].py[1] =2;    car[0].pz[1] =4;
  128.     car[0].px[2] =5;    car[0].py[2] =2;    car[0].pz[2] =0;
  129.     car[0].px[3] =0;    car[0].py[3] =-5;    car[0].pz[3] =0;
  130.     car[0].type = C32K(31,0,0);
  131.     car[1].px[0] =0;    car[1].py[0] =-5;    car[1].pz[0] =4;
  132.     car[1].px[1] =-5;    car[1].py[1] =2;    car[1].pz[1] =4;
  133.     car[1].px[2] =-5;    car[1].py[2] =2;    car[1].pz[2] =0;
  134.     car[1].px[3] =0;    car[1].py[3] =-5;    car[1].pz[3] =0;
  135.     car[1].type = C32K(31,0,0);
  136.  
  137.     memcpy( ecar, car, sizeof(poly)*3 );
  138.     ecar[0].type = 25;
  139.     ecar[1].type = 25;
  140.     ecar[2].type = 31;
  141.  
  142.     return 1;
  143. }
  144. /*=================================
  145.     wayデータの読み書き
  146. =================================*/
  147. #define    WDSIZE ((2*6+8*1001)*12)
  148. char *compressAway( way *wd, char *dc )
  149. {
  150.     struct cwdata{
  151.         short lt;
  152.         short st[5];
  153.         vect  pt[1001];
  154.         short ag[1001];
  155.     } *wds;
  156.     wds = (struct cwdata *)dc;
  157.  
  158.     int    i,j;
  159.     memcpy( wds, &(wd->ltime), sizeof(short)*6);
  160.     j = (wd->ltime -1) /10;
  161.     for(i=0; i<j; ++i)
  162.     {
  163.         wds->pt[i] = wd->pt[i*10];
  164.         wds->ag[i] = wd->ang[i*10];
  165.     }
  166.     wds->pt[i+1] = wd->pt[wd->ltime];
  167.     wds->ag[i+1] = wd->ang[wd->ltime];
  168.  
  169.     return dc+sizeof(struct cwdata);
  170. }
  171. void compress_waydata( char *wdc )
  172. {
  173.     int i;
  174.     for(i=0; i<6; ++i)
  175.         wdc = compressAway(waybst+i,wdc);
  176.     for(i=0; i<6; ++i)
  177.         wdc = compressAway(way1st+i,wdc);
  178. }
  179. void    makeUpWay( way *wd, int st, int ed )
  180. {
  181.     int    i=st, j, gap=ed-st;
  182.     int    a0,a1;
  183.     for(j=1; j<gap; j++)
  184.     {
  185.         wd->pt[i+j].x = ( wd->pt[i].x*(gap-j) +
  186.                             wd->pt[i+gap].x*j )/gap ;
  187.         wd->pt[i+j].y = ( wd->pt[i].y*(gap-j) +
  188.                             wd->pt[i+gap].y*j )/gap ;
  189.         wd->pt[i+j].z = ( wd->pt[i].z*(gap-j) +
  190.                             wd->pt[i+gap].z*j )/gap ;
  191.         a0 = wd->ang[i];
  192.         a1 = wd->ang[i+gap];
  193.         if( a0>800 && a1<200 ) a1+=1000;
  194.         if( a1>800 && a0<200 ) a0+=1000;
  195.         wd->ang[i+j] = (( a0*(gap-j)+a1*j )/gap) %1000 ;
  196.     }
  197.     return ;
  198. }
  199. char *decompressAway( way *wd, char *dc )
  200. {
  201.     struct cwdata{
  202.         short lt;
  203.         short st[5];
  204.         vect  pt[1001];
  205.         short ag[1001];
  206.     } *wds;
  207.     wds = (struct cwdata *)dc;
  208.  
  209.     int    i,j;
  210.     memcpy( &(wd->ltime), wds, sizeof(short)*6);
  211.     j = (wd->ltime -1) /10;
  212.     for(i=0; i<j; ++i)
  213.     {
  214.         wd->pt[i*10] = wds->pt[i];
  215.         wd->ang[i*10]= wds->ag[i];
  216.     }
  217.     for(i=1; i<j; ++i)
  218.         makeUpWay( wd, i*10, (i+1)*10 );
  219.     wd->pt[i*10] = wds->pt[i+1];
  220.     wd->ang[i*10]= wds->ag[i+1];
  221.     makeUpWay( wd, (i+1)*10, wd->ltime );
  222.  
  223.     return dc+sizeof(struct cwdata);
  224. }
  225. void decompress_waydata( char *wdc )
  226. {
  227.     int    i;
  228.     for(i=0; i<6; ++i)
  229.         wdc = decompressAway(waybst+i,wdc);
  230.     for(i=0; i<6; ++i)
  231.         wdc = decompressAway(way1st+i,wdc);
  232. }
  233. void read_waydata(int mn)
  234. {
  235.     FILE    *fp;
  236.     int    i;
  237.     fp = fopen(wayfile[mn],"rb");
  238.     if( fp==NULL ){
  239.         for(i=0; i<6; i++){
  240.             way1st[i].ltime = 0;
  241.             waybst[i].ltime = 0;
  242.         }
  243.         return;
  244.     }
  245.     char    *wdat;
  246.     wdat = malloc( WDSIZE );
  247.     if( wdat==NULL ){
  248.         puts("Can't alloc memory!!");
  249.         exit(0);
  250. //        if( rdata!=NULL )
  251. //            wdat = (char *)cway;
  252.     }
  253.     fread( wdat, 1, WDSIZE, fp );
  254. //    fread( way1st, sizeof(way), 6, fp );
  255. //    fread( waybst, sizeof(way), 6, fp );
  256.     fclose( fp );
  257.     decompress_waydata( wdat );
  258. }
  259. void save_waydata(int mn)
  260. {
  261.     FILE *fp;
  262.     fp = fopen(wayfile[mn],"wb");
  263.     if( fp==NULL ) return;
  264.  
  265.     char    *wdat;
  266.     wdat = malloc( WDSIZE );
  267.     if( wdat==NULL ){
  268.         puts("Can't alloc memory!!");
  269.         exit(0);
  270. //        if( rdata!=NULL )
  271. //            wdat = (char *)cway;
  272.     }
  273.     compress_waydata( wdat );
  274.     fwrite( wdat, 1, WDSIZE, fp );
  275.     fclose( fp );
  276. }
  277.  
  278. /*==============================
  279.     ベストラップの読み書き
  280. ==============================*/
  281. void read_bestlap(int mn)
  282. {
  283.     FILE    *fp;
  284.     int        i;
  285.     fp=fopen(lapfile[mn],"rb");
  286.     if (fp==NULL)
  287.         for(i=0; i<10; ++i){
  288.             blap[i]=30000; flap[i]=30000;
  289.         }
  290.     else{
  291.         fread( blap, sizeof(short), 10, fp );
  292.         fread( flap, sizeof(short), 10, fp );
  293.         fclose(fp);
  294.     }
  295. }
  296. void save_bestlap(int mn)
  297. {
  298.     FILE    *fp;
  299.     fp=fopen(lapfile[mn],"wb");
  300.     if( fp==NULL ) return;
  301.     fwrite( blap, sizeof(short), 10, fp );
  302.     fwrite( flap, sizeof(short), 10, fp );
  303.     fclose(fp);
  304. }
  305.  
  306. /*===================
  307.     ラップの更新
  308. ===================*/
  309. #define    swap(x,y)    {(y)^=(x);(x)^=(y);(y)^=(x);}
  310. void    setLap( short blp, short flp )
  311. {
  312.     int    i;
  313.     if( blp<blap[9] )
  314.     {
  315.         lapFlag=1;
  316.         blap[9]=blp;
  317.         for(i=8; i>=0; --i){
  318.             if(blap[i]<=blap[i+1]) break;
  319.             swap(blap[i+1],blap[i]);
  320.         }
  321.     }
  322.     if( flp<flap[9] )
  323.     {
  324.         lapFlag=1;
  325.         flap[9]=flp;
  326.         for(i=8; i>=0; --i){
  327.             if(flap[i]<=flap[i+1]) break;
  328.             swap(flap[i+1],flap[i]);
  329.         }
  330.     }
  331. }
  332. /*============================
  333.     三角関数データのセット
  334. ============================*/
  335. void    setSCdata()
  336. {
  337.     int    i;
  338.     for(i=0; i<1000; ++i){
  339.         _cos[i] = cos(_PI*2*i/1000)*100;
  340.         _sin[i] = sin(_PI*2*i/1000)*100;
  341.     }
  342. }
  343. /*==================================
  344.     マップの読み込み (二度目以降)
  345. ==================================*/
  346. short sx,sy,sang;
  347. changeMap( int mn )
  348. {
  349.     int    i;
  350.     if (lapFlag!=0) {
  351.         save_bestlap(mapNo) ;
  352.         lapFlag = 0 ;
  353.     }
  354.     if (wayFlag!=0) {
  355.         save_waydata(mapNo);
  356.         wayFlag = 0 ;
  357.     }
  358.     free(mapdata);
  359.     free(road);
  360.     free(cp);
  361.     free(exTime);
  362.     free(poldat);
  363.  
  364.     mapNo = mn;
  365.     //    マップデータの読み込み
  366.     i = read_mapdata( mapNo,&sx,&sy,&sang );
  367.     if( i==-1 ) {
  368.         puts("メモリが足りません");
  369.     }
  370.     if( i<0 ) exit(0);
  371.  
  372.     //    ポリゴン描画用データエリア取得
  373.     poldat = (pol2d *)malloc( sizeof(pol2d)*polmax );
  374.     if( poldat==NULL ) {
  375.         puts("メモリが足りません");
  376.         exit(0);
  377.     }
  378.     //    走行データ等の読み込み
  379.     read_waydata(mapNo);
  380.     read_bestlap(mapNo);
  381. }
  382.  
  383. /*===================
  384.     メイン関数
  385. ===================*/
  386. void main(int argc, char *argv[])
  387. {
  388.     int    i;
  389.  
  390.     //    maxtime( 画面更新の時間 ) の決定
  391.     if( argc>1 )
  392.         if( *(argv[1])=='/' && *(argv[1]+1)=='t' )
  393.             sscanf(argv[1],"/t%d",&maxtime);
  394.     if( maxtime<=0 || maxtime>=20 ) maxtime = 7;
  395.  
  396.     //    マップデータの読み込み
  397.     i = read_mapdata( mapNo,&sx,&sy,&sang );
  398.     if( i==-1 ) {
  399.         puts("メモリが足りません");
  400.     }
  401.     if( i<0 ) exit(0);
  402.  
  403.     //    ポリゴン描画用データエリア取得
  404.     poldat = (pol2d *)malloc( sizeof(pol2d)*polmax );
  405.     if( poldat==NULL ) {
  406.         puts("メモリが足りません");
  407.         exit(0);
  408.     }
  409.     //    走行データ保存エリアの取得
  410.     way1st = (way *)malloc( sizeof(way)*6 );
  411.     waybst = (way *)malloc( sizeof(way)*6 );
  412.     if( way1st==NULL || waybst==NULL ) {
  413.         puts("メモリが足りません");
  414.         exit(0);
  415.     }
  416.     //    その他のメモリ取得
  417.     _cos = (int *)malloc( sizeof(int)*1000 );
  418.     _sin = (int *)malloc( sizeof(int)*1000 );
  419.     if( _cos==NULL || _sin==NULL ) {
  420.         puts("メモリが足りません");
  421.         exit(0);
  422.     }
  423.  
  424.     //    走行データ等の読み込み
  425.     read_waydata(mapNo);
  426.     read_bestlap(mapNo);
  427.     setCarDat();
  428.  
  429.     //    初期化
  430.     setSCdata();
  431.     if (-1==initGrp()) {
  432.         puts("グラフィックのイニシャライズに失敗しました。");
  433.         puts("メモリの不足と思われます。");
  434.         exit(0);
  435.     }
  436.  
  437.     //    デモ & ゲーム
  438.     int    f=0;
  439.     while(1)
  440.     {
  441.         if( demo(f,sx,sy)==-1 ) break;
  442.         game(sx,sy,sang);
  443.         f=1;
  444.     };
  445.  
  446.     //    終了処理
  447.     if( lapFlag!=0 )
  448.         save_bestlap(mapNo);
  449.     if( wayFlag!=0 )
  450.         save_waydata(mapNo);
  451.  
  452.     int    t=0;
  453.     for(f=0; f<10; ++f){
  454.         printf("%2d(csec) : %5d time(s) \t%2d(csec) : %5d time(s)\n"
  455.                 ,f,_time[f],f+10,_time[f+10]);
  456.         t += _time[f]*f+_time[f+10]*(f+10);
  457.     }
  458.     printf("%d(csec) で %d 回 描画。 平均秒間 %d.%2d 枚\n"
  459.                             ,t,_dn,_dn*100/t,(_dn*10000/t)%100);
  460.     printf("画面更新(予定)時間:%d \t",maxtime);
  461.     printf("平均描画時間:%d.%02d\n",t/_dn,(t*100/_dn)%100);
  462. }
  463.  
  464.